/**
 */
 

/**
 * {@link http://blog.csdn.net/justloveyou_/article/details/55045638}
 * 面向对象技术可以很好地解决一些灵活性或可扩展性问题，
 * 但在很多情况下需要在系统中增加类和对象的个数。
 * 当对象数量太多时，将导致运行代价过高，带来性能下降等问题。
 * 享元模式正是为解决这一类问题而诞生的。
 * 享元模式通过共享技术实现相同或相似对象的重用。
 * 
 * 
 * 在享元模式中可以共享的相同内容称为 内部状态(Intrinsic State)，
 * 而那些需要外部环境来设置的不能共享的内容称为 外部状态(Extrinsic State)，
 * 其中外部状态和内部状态是相互独立的，外部状态的变化不会引起内部状态的变化。
 * 由于区分了内部状态和外部状态，
 * 因此可以通过设置不同的外部状态使得相同的对象可以具有一些不同的特征，
 * 而相同的内部状态是可以共享的。
 * 也就是说，享元模式的本质是分离与共享 ： 分离变与不变，并且共享不变。
 * 把一个对象的状态分成内部状态和外部状态，内部状态即是不变的，外部状态是变化的；
 * 然后通过共享不变的部分，达到减少对象数量并节约内存的目的。
 *
 * 在享元模式中通常会出现工厂模式，
 * 需要创建一个享元工厂来负责维护一个享元池(Flyweight Pool)（用于存储具有相同内部状态的享元对象）。
 * 在享元模式中，共享的是享元对象的内部状态，外部状态需要通过环境来设置。
 * 在实际使用中，能够共享的内部状态是有限的，
 * 因此享元对象一般都设计为较小的对象，它所包含的内部状态较少，这种对象也称为 细粒度对象。
 * 享元模式的目的就是使用共享技术来实现大量细粒度对象的复用。
 */

/**
 * 享元模式要求能够共享的对象必须是细粒度对象，因此它又称为轻量级模式，它是一种 对象结构型模式。
 */
package a19_flyweight;